package cn.enine.autocopy.util;

import android.app.Activity;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import android.app.Activity;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Created by Administrator on 2017/12/9.
 */

public class BinderUtil {
    public static void exeFindById(Activity activity){

        //获取每个activity对应的类类型
        Class<? extends Activity> aClass = activity.getClass();
        //获取该类型中所有的属性信息
        Field[] fields = aClass.getDeclaredFields();

        //遍历每个属性信息
        for (Field field : fields) {
            //判断该属性上是否有FindIdAnno这个注解的类类型
            BinderPojo anno = field.getAnnotation(BinderPojo.class);
            //如果有就会拿到对应的注解信息，没有就会返回空
            if(anno != null){
                //判断该属性是否是属于View的子类类型，并且不是静态属性
                if(View.class.isAssignableFrom(field.getType()) && !Modifier.isStatic(field.getModifiers())){
                    try {
                        //拿到注解上的ID
                        int id = anno.value();
                        //拿到该类中的findViewById方法，对应传参为int类型
                        Method method = aClass.getMethod("findViewById", int.class);
                        //然后执行该findViewById的方法
                        Object invoke = method.invoke(activity, id);
                        //如果属性是私有的就修改一些访问权限，以便于我们修改值
                        field.setAccessible(true);
                        //将拿到的参数设置到对应的属性上，大公告成
                        field.set(activity,invoke);
                    } catch (NoSuchMethodException e) {
                        e.printStackTrace();
                    } catch (InvocationTargetException e) {
                        e.printStackTrace();
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }

    public static boolean copyData(Activity activity, Object model){
        //获取每个activity对应的类类型
        Class<? extends Activity> aClass = activity.getClass();
        //获取该类型中所有的属性信息
        Field[] fields = aClass.getDeclaredFields();
        boolean validate = true;
        //遍历每个属性信息
        for (Field field : fields) {
            //判断该属性上是否有FindIdAnno这个注解的类类型
            BinderPojo anno = field.getAnnotation(BinderPojo.class);
            //如果有就会拿到对应的注解信息，没有就会返回空
            if(anno != null){
                //判断该属性是否是属于View的子类类型，并且不是静态属性
                if(View.class.isAssignableFrom(field.getType()) && !Modifier.isStatic(field.getModifiers())){
                    try {
                        //拿到注解上的ID
                        int id = anno.value();
                        //实体类上的属性
                        String name = anno.name();
                        //require控制表单中是否必填
                        boolean require  = anno.require();
                        //表单中某属性正则表达式
                        String regex = anno.regex();
                        //表单验证是提示信息
                        String promptMsg = anno.promptMsg();

                        boolean pojoProperty = anno.pojoProperty();
                        if(pojoProperty){
                            View view = (View) activity.findViewById(id);
                            Field objField = model.getClass().getDeclaredField(field.getName());
                            //如果属性是私有的就修改一些访问权限，以便于我们修改值
                            objField.setAccessible(true);
                            String type = objField.getGenericType().toString();
                            String newname = name.substring(0, 1).toUpperCase() + name.substring(1); // 将属性的首字符大写，方便构造get，set方法
                            if (type.equals("class java.lang.String")) { // 如果type是类类型，则前面包含"class "，后面跟类名
                                Method m = model.getClass().getMethod("get" + newname);

                                String value = (String) m.invoke(model); // 调用getter方法获取属性值
                                if (value == null) {
                                    m = model.getClass().getMethod("set"+newname,String.class);
                                    String editValue = "";
                                    if(view instanceof TextView){
                                        TextView textView = (TextView)view;
                                        editValue = ""+textView.getText();
                                    }
                                    if(view instanceof EditText){
                                        EditText editText = (EditText)view;
                                        editValue = ""+editText.getText();
                                    }
                                    m.invoke(model, editValue);

                                    if(require){//不能为空
                                        if(null== editValue || "".equals(editValue)){//不能为空但表单中为空了
                                            System.out.println("name:" + name + "===============>" + editValue);
                                            MyToastUtil.ShowToast(activity, promptMsg);
                                            validate = false;
                                            break;
                                        }else if(!"NullContent".equals(regex) && !BinderUtil.validateRegx(editValue, regex)){//不能为空且有正则表达式验证
                                            System.out.println("name:"+name+"===============>"+editValue+"----"+promptMsg);
                                            MyToastUtil.ShowToast(activity, promptMsg);
                                            validate = false;
                                            break;
                                        }
                                    }else {//可以为空
                                        if(!"NullContent".equals(regex) && !BinderUtil.validateRegx(editValue, regex)){//可以为空但有正则表达式验证
                                            System.out.println("name:"+name+"===============>"+editValue+"----"+promptMsg);
                                            MyToastUtil.ShowToast(activity, promptMsg);
                                            validate = false;
                                            break;
                                        }
                                    }
                                }
                            }
                        }
                    } catch (NoSuchMethodException e) {
                        e.printStackTrace();
                    } catch (InvocationTargetException e) {
                        e.printStackTrace();
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    } catch (NoSuchFieldException e) {
                        //e.printStackTrace();
                    }
                }
            }
        }
        return validate;
    }

    public static void initData(Activity activity, Object model){
        System.out.println("initData===>");
        //获取每个activity对应的类类型
        Class<? extends Activity> aClass = activity.getClass();
        //获取该类型中所有的属性信息
        Field[] fields = aClass.getDeclaredFields();
        //遍历每个属性信息
        for (Field field : fields) {
            //判断该属性上是否有FindIdAnno这个注解的类类型
            BinderPojo anno = field.getAnnotation(BinderPojo.class);
            //如果有就会拿到对应的注解信息，没有就会返回空
            if(anno != null){
                //判断该属性是否是属于View的子类类型，并且不是静态属性
                if(View.class.isAssignableFrom(field.getType()) && !Modifier.isStatic(field.getModifiers())){
                    try {
                        //拿到注解上的ID
                        int id = anno.value();
                        //实体类上的属性
                        String name = anno.name();
                        //require控制表单中是否必填
                        boolean require  = anno.require();
                        //表单中某属性正则表达式
                        String regex = anno.regex();
                        //表单验证是提示信息
                        String promptMsg = anno.promptMsg();

                        boolean pojoProperty = anno.pojoProperty();
                        if(pojoProperty){
                            Field objField = model.getClass().getDeclaredField(field.getName());
                            //如果属性是私有的就修改一些访问权限，以便于我们修改值
                            objField.setAccessible(true);
                            String type = objField.getGenericType().toString();
                            String newname = name.substring(0, 1).toUpperCase() + name.substring(1); // 将属性的首字符大写，方便构造get，set方法
                            String jg = "";
                            if (type.equals("class java.lang.String")) { // 如果type是类类型，则前面包含"class "，后面跟类名
                                Method m = model.getClass().getMethod("get" + newname);
                                jg = (String) m.invoke(model);
                                System.out.println("jg===>"+jg);
                            }
                            View view = (View) activity.findViewById(id);
                            if(view instanceof TextView){
                                TextView textView = (TextView)view;
                                textView.setText(jg);
                            }
                            if(view instanceof EditText){
                                EditText editText = (EditText)view;
                                editText.setText(jg);
                            }
                        }
                    } catch (NoSuchMethodException e) {
                        e.printStackTrace();
                    } catch (InvocationTargetException e) {
                        e.printStackTrace();
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    } catch (NoSuchFieldException e) {
                        //e.printStackTrace();
                    }
                }
            }
        }
    }

    public static boolean validateRegx(String str, String regEx){
        //String str = "service@xsoftlab.net";
        // 邮箱验证规则
        //String regEx = "[a-zA-Z_]{1,}[0-9]{0,}@(([a-zA-z0-9]-*){1,}\\.){1,3}[a-zA-z\\-]{1,}";
        // 编译正则表达式
        Pattern pattern = Pattern.compile(regEx);
        // 忽略大小写的写法
        // Pattern pat = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE);
        Matcher matcher = pattern.matcher(str);
        // 字符串是否与正则表达式相匹配
        boolean rs = matcher.matches();
        System.out.println(rs);

        return rs;
    }

    public static void main(String[] args){
        BinderUtil.validateRegx("service@xsoftlab.net", "[a-zA-Z_]{1,}[0-9]{0,}@(([a-zA-z0-9]-*){1,}\\.){1,3}[a-zA-z\\-]{1,}");
    }

}